package main

import (
	"fmt"
)

//接口 interface
func main() {
	fmt.Println("examp17")
	p1 := person{"张三", "人", "100KG"}
	print(p1)
	b1 := bird{"小不点", "鸟", "1K", "abcd"}
	print(b1)
	a1 := abcd{} //未全实现的方法
	a1.mtype()
	//print(a1) //因为只实现了种类方法，没实现体重方法所以此处会报错
	//当做object来使用
	gmobject("abcd")
	gmobject(100)

}

//定义结构
type person struct { //人
	name string
	sp   string
	wg   string
}

type bird struct { //鸟
	name string
	sp   string
	wg   string
	ccc  interface{}
}
type abcd struct { //只实现了一个方法，被视为没有实现animal接口
}

func (me abcd) mtype() string { //实现animal接口mtype方法
	return "abcd"
}
func (me person) mtype() string { //实现animal接口mtype方法
	return me.sp
}
func (me person) weight() string { //实现animal接口weight方法
	return me.wg
}
func (me bird) mtype() string { //实现animal接口mtype方法
	return me.sp
}
func (me bird) weight() string { //实现animal接口weight方法
	return me.wg
}

//定义接口
type animal interface { //定义接口动物
	mtype() string  //种类 方法
	weight() string //体重 方法
}

func print(a animal) { //接口类型做为参数，打印
	sp := a.mtype()
	wg := a.weight()
	fmt.Println("种类=", sp, "体重=", wg)
	//这里可以判断是哪个类型实现了这个接口
	if p, ok := a.(person); ok { //判断某个类型实现了该接口，使用 接口.(类型) 返回值有两个,
		//类型,bool,bool为true时为成功此时可以直接通过类型获取相应属性
		fmt.Println(p.name)
	} else if b, ok := a.(bird); ok {
		fmt.Println(b.name)
	}
}

func gmobject(a interface{}) { //可以当作object来使用
	switch a.(type) { //通过.(type) 来判断是什么类型
	case string:
		fmt.Println("string", a)
	case int:
		fmt.Println("int", a)
	}
}
